Return to start page

Systems/Character/Struct Inventory.j

Code

		
1			library AStructSystemsCharacterInventory requires ALibraryCoreGeneralPlayer, AStructCoreGeneralHashTable, ALibraryCoreGeneralUnit, ALibraryCoreStringConversion, AStructSystemsCharacterAbstractCharacterSystem, AStructSystemsCharacterCharacter, AStructSystemsCharacterItemType
2
3 struct AInventoryItemData
4 //dynamic members
5 private integer m_itemTypeId
6 private integer m_charges
7 private integer m_dropId
8 private boolean m_invulnerable
9 private real m_life
10 private boolean m_pawnable
11 private player m_player
12 private integer m_userData
13 private boolean m_visible
14 //members
15 private itemtype m_itemType
16
17 public method setItemTypeId takes integer itemTypeId returns nothing
18 set this.m_itemTypeId = itemTypeId
19 endmethod
20
21 public method itemTypeId takes nothing returns integer
22 return this.m_itemTypeId
23 endmethod
24
25 public method setCharges takes integer charges returns nothing
26 set this.m_charges = charges
27 endmethod
28
29 public method charges takes nothing returns integer
30 return this.m_charges
31 endmethod
32
33 public method setDropId takes integer dropId returns nothing
34 set this.m_dropId = dropId
35 endmethod
36
37 public method dropId takes nothing returns integer
38 return this.m_dropId
39 endmethod
40
41 public method setInvulnerable takes boolean invulnerable returns nothing
42 set this.m_invulnerable = invulnerable
43 endmethod
44
45 public method invulnerable takes nothing returns boolean
46 return this.m_invulnerable
47 endmethod
48
49 public method setLife takes real life returns nothing
50 set this.m_life = life
51 endmethod
52
53 public method life takes nothing returns real
54 return this.m_life
55 endmethod
56
57 public method setPawnable takes boolean pawnable returns nothing
58 set this.m_pawnable = pawnable
59 endmethod
60
61 public method pawnable takes nothing returns boolean
62 return this.m_pawnable
63 endmethod
64
65 public method setPlayer takes player user returns nothing
66 set this.m_player = user
67 endmethod
68
69 public method player takes nothing returns player
70 return this.m_player
71 endmethod
72
73 public method setUserData takes integer userData returns nothing
74 set this.m_userData = userData
75 endmethod
76
77 public method userData takes nothing returns integer
78 return this.m_userData
79 endmethod
80
81 public method setVisible takes boolean visible returns nothing
82 set this.m_visible = visible
83 endmethod
84
85 public method visible takes nothing returns boolean
86 return this.m_visible
87 endmethod
88
89 public method itemType takes nothing returns itemtype
90 return this.m_itemType
91 endmethod
92
93 public method createItem takes real x, real y returns item
94 local item result = CreateItem(this.m_itemTypeId, x, y)
95 call SetItemCharges(result, this.m_charges)
96 call SetItemDropID(result, this.m_dropId)
97 call SetItemInvulnerable(result, this.m_invulnerable)
98 call SetWidgetLife(result, this.m_life)
99 call SetItemPawnable(result, this.m_pawnable)
100 call SetItemPlayer(result, this.m_player, true)
101 call SetItemUserData(result, this.m_userData)
102 call SetItemVisible(result, this.m_visible)
103 return result
104 endmethod
105
106 public method assignToItem takes item usedItem returns nothing
107 call SetItemCharges(usedItem, this.m_charges)
108 call SetItemDropID(usedItem, this.m_dropId)
109 call SetItemInvulnerable(usedItem, this.m_invulnerable)
110 call SetWidgetLife(usedItem, this.m_life)
111 call SetItemPawnable(usedItem, this.m_pawnable)
112 call SetItemPlayer(usedItem, this.m_player, true)
113 call SetItemUserData(usedItem, this.m_userData)
114 call SetItemVisible(usedItem, this.m_visible)
115 endmethod
116
117 public method isCharged takes nothing returns boolean
118 return (this.m_itemType == ITEM_TYPE_CHARGED and this.m_charges > 1) or (this.m_itemType != ITEM_TYPE_CHARGED and this.m_charges > 0)
119 endmethod
120
121 public static method create takes item usedItem, unit usedUnit returns thistype
122 local thistype this = thistype.allocate()
123 //dynamic members
124 set this.m_itemTypeId = GetItemTypeId(usedItem)
125 set this.m_charges = GetItemCharges(usedItem)
126 set this.m_dropId = GetUnitTypeId(usedUnit)
127 set this.m_invulnerable = IsItemInvulnerable(usedItem)
128 set this.m_life = GetWidgetLife(usedItem)
129 set this.m_pawnable = IsItemPawnable(usedItem)
130 set this.m_player = GetItemPlayer(usedItem)
131 set this.m_userData = GetItemUserData(usedItem)
132 set this.m_visible = IsItemVisible(usedItem)
133 //members
134 set this.m_itemType = GetItemType(usedItem)
135 return this
136 endmethod
137
138 public method onDestroy takes nothing returns nothing
139 //members
140 set this.m_itemType = null
141 endmethod
142 endstruct
143
144 /// Item types of chargable items should always be ITEM_TYPE_CHARGED!
145 /// @todo Use UnitDropItemSlot instead of item removals.
146 struct AInventory extends AAbstractCharacterSystem
147 //static constant members, useful for GUIs
148 public static constant integer maxEquipmentTypes = 5//AItemType.maxEuqipmentTypes /// @todo vJass bug //AClassCharacterItemType
149 public static constant integer maxRucksackItems = 128
150 public static constant integer maxRucksackPages = 32 //maxRucksackItems / maxRucksackItemsPerPage
151 public static constant integer maxRucksackItemsPerPage = 4
152 //static start members
153 private static integer leftArrowItemType
154 private static integer rightArrowItemType
155 private static integer openRucksackAbilityId
156 private static string textUnableToEquipItem
157 private static string textEquipItem
158 private static string textUnableToAddRucksackItem
159 private static string textAddItemToRucksack
160 private static string textUnableToMoveRucksackItem
161 private static string textDropPageItem
162 //members
163 private AInventoryItemData array m_equipmentItemData[thistype.maxEquipmentTypes]
164 private AInventoryItemData array m_rucksackItemData[thistype.maxRucksackItems]
165 private trigger m_openTrigger
166 private trigger m_orderTrigger
167 private trigger m_useTrigger //show next page, show previous page, disable in equipment
168 private trigger m_pickupTrigger //pickup
169 private trigger m_dropTrigger //drop
170 private integer m_rucksackPage
171 private boolean m_rucksackIsEnabled
172
173 //! runtextmacro optional A_STRUCT_DEBUG("\"AInventory\"")
174
175 //members
176
177 public method equipmentItemData takes integer equipmentType returns AInventoryItemData
178 debug if (equipmentType >= thistype.maxEquipmentTypes or equipmentType < 0) then
179 debug call this.print("Wrong equipment type: " + I2S(equipmentType) + ".")
180 debug return 0
181 debug endif
182 return this.m_equipmentItemData[equipmentType]
183 endmethod
184
185 public method rucksackItemData takes integer index returns AInventoryItemData
186 debug if (index >= thistype.maxRucksackItems or index < 0) then
187 debug call this.print("Wrong rucksack index: " + I2S(index) + ".")
188 debug return 0
189 debug endif
190 return this.m_rucksackItemData[index]
191 endmethod
192
193 //convenience methods
194
195 public method allEquipmentItems takes nothing returns integer
196 local integer result = 0
197 local integer i = 0
198 loop
199 exitwhen (i == thistype.maxEquipmentTypes)
200 if (this.m_equipmentItemData[i] != 0) then
201 set result = result + 1
202 endif
203 set i = i + 1
204 endloop
205 return result
206 endmethod
207
208 public method allRucksackItems takes nothing returns integer
209 local integer result = 0
210 local integer i = 0
211 loop
212 exitwhen (i == thistype.maxRucksackItems)
213 if (this.m_rucksackItemData[i] != 0) then
214 set result = result + 1
215 endif
216 set i = i + 1
217 endloop
218 return result
219 endmethod
220
221 public method allRucksackItemCharges takes nothing returns integer
222 local integer result = 0
223 local integer i = 0
224 loop
225 exitwhen (i == thistype.maxRucksackItems)
226 if (this.m_rucksackItemData[i] != 0) then
227 set result = result + this.m_rucksackItemData[i].charges()
228 endif
229 set i = i + 1
230 endloop
231 return result
232 endmethod
233
234 /// Removes the first found item with item type id @param itemTypeId.
235 public method removeFromRucksackByTypeId takes integer itemTypeId, boolean drop returns nothing
236 local integer i = 0
237 loop
238 exitwhen (i == thistype.maxRucksackItems)
239 if (this.m_rucksackItemData[i].itemTypeId() != itemTypeId) then
240 call this.clearRucksackItem(i, drop)
241 exitwhen (true)
242 endif
243 set i = i + 1
244 endloop
245 endmethod
246
247 //methods
248
249 /// @return Returns the Warcraft inventory slot number by a rucksack item index.
250 public method rucksackItemSlot takes integer index returns integer
251 debug if (index >= thistype.maxRucksackItems or index < 0) then
252 debug call this.print("Wrong rucksack index: " + I2S(index) + ".")
253 debug return 0
254 debug endif
255 return index - this.m_rucksackPage * AInventory.maxRucksackItemsPerPage
256 endmethod
257
258 /// @return Returns the rucksack item index by a Warcraft inventory slot number.
259 public method slotRucksackIndex takes integer slot returns integer
260 debug if (slot >= thistype.maxRucksackItemsPerPage or slot < 0) then
261 debug call this.print("Wrong inventory slot: " + I2S(slot) + ".")
262 debug return 0
263 debug endif
264 return this.m_rucksackPage * thistype.maxRucksackItemsPerPage + slot
265 endmethod
266
267 /// Shows the current page in the inventory of the character's unit
268 /// In general you do not have to call this method. The system handles itself.
269 public method enable takes nothing returns nothing
270 call super.enable()
271 if (this.m_rucksackIsEnabled) then
272 call this.enableRucksack()
273 else
274 call this.enableEquipment()
275 endif
276
277 /// @todo wait for calling methods above?
278 call EnableTrigger(this.m_openTrigger)
279 call EnableTrigger(this.m_orderTrigger)
280 call EnableTrigger(this.m_pickupTrigger)
281 call EnableTrigger(this.m_dropTrigger)
282 endmethod
283
284 /// Usually you do not have to call this method. The system handles itself.
285 public method disable takes nothing returns nothing
286 call super.disable()
287 if (this.m_rucksackIsEnabled) then
288 call this.disableRucksack()
289 else
290 call this.disableEquipment()
291 endif
292
293 /// @todo wait for calling methods above?
294 call DisableTrigger(this.m_openTrigger)
295 call DisableTrigger(this.m_orderTrigger)
296 call DisableTrigger(this.m_pickupTrigger)
297 call DisableTrigger(this.m_dropTrigger)
298 endmethod
299
300 /// @return Returns the slot of the equipped item. If no item was found it returns -1.
301 public method hasItemEquipped takes integer itemTypeId returns integer
302 local integer i = 0
303 loop
304 exitwhen (i == thistype.maxEquipmentTypes)
305 if (this.m_equipmentItemData[i].itemTypeId() == itemTypeId) then
306 return i
307 endif
308 set i = i + 1
309 endloop
310 return -1
311 endmethod
312
313 /// @return Returns the slot of the rucksack item. If not item was found it returns -1.
314 public method hasItemTypeInRucksack takes integer itemTypeId returns integer
315 local integer i = 0
316 loop
317 exitwhen (i == thistype.maxRucksackItems)
318 if (this.m_rucksackItemData[i].itemTypeId() == itemTypeId) then
319 return i
320 endif
321 set i = i + 1
322 endloop
323 return -1
324 endmethod
325
326 /// Stacks everything in rucksack which is stackable.
327 public method cleanUpRucksack takes nothing returns nothing
328 local integer i = thistype.maxRucksackItems - 1
329 local integer j
330 debug call this.print("Cleaning up rucksack.")
331 loop
332 exitwhen (i < 0)
333 set j = 0
334 loop
335 exitwhen (j == thistype.maxRucksackItems)
336 if (i != j and this.m_rucksackItemData[i] != 0 and this.m_rucksackItemData[i].itemTypeId() == this.m_rucksackItemData[j].itemTypeId()) then
337 call this.m_rucksackItemData[i].setCharges(this.m_rucksackItemData[i].charges() + this.m_rucksackItemData[j].charges())
338 call this.clearRucksackItem(j, false)
339 call this.refreshRucksackItemCharges(i)
340 endif
341 set j = j + 1
342 endloop
343 set i = i - 1
344 endloop
345 endmethod
346
347 private method enableEquipment takes nothing returns nothing
348 local integer i
349 set i = 0
350 loop
351 exitwhen (i == thistype.maxEquipmentTypes)
352 if (this.m_equipmentItemData[i] != 0) then
353 call this.showEquipmentItem(i)
354 endif
355 set i = i + 1
356 endloop
357 endmethod
358
359 private method disableEquipment takes nothing returns nothing
360 local integer i
361 set i = 0
362 loop
363 exitwhen (i == thistype.maxEquipmentTypes)
364 if (this.m_equipmentItemData[i] != 0) then
365 call this.hideEquipmentItem(i)
366 endif
367 set i = i + 1
368 endloop
369 endmethod
370
371 private method enableRucksack takes nothing returns nothing
372 local unit characterUnit = this.unit()
373 local item leftArrowItem
374 local item rightArrowItem
375 set this.m_rucksackIsEnabled = true
376 call this.showRucksackPage(this.m_rucksackPage, true)
377 call DisableTrigger(this.m_pickupTrigger)
378 call UnitAddItemToSlotById(characterUnit, thistype.leftArrowItemType, AInventory.maxRucksackItemsPerPage)
379 call UnitAddItemToSlotById(characterUnit, thistype.rightArrowItemType, thistype.maxRucksackItemsPerPage + 1)
380 call EnableTrigger(this.m_pickupTrigger)
381 set leftArrowItem = UnitItemInSlot(characterUnit, thistype.maxRucksackItemsPerPage)
382 set rightArrowItem = UnitItemInSlot(characterUnit, thistype.maxRucksackItemsPerPage + 1)
383 call SetItemDroppable(leftArrowItem, true) //for moving items to next or previous pages
384 call SetItemDroppable(rightArrowItem, true)
385 call SetItemCharges(rightArrowItem, this.m_rucksackPage)
386 set characterUnit = null
387 set leftArrowItem = null
388 set rightArrowItem = null
389 endmethod
390
391 private method disableRucksack takes nothing returns nothing
392 local unit characterUnit = this.unit()
393 local item leftArrowItem
394 local item rightArrowItem
395 set this.m_rucksackIsEnabled = false
396 set leftArrowItem = UnitItemInSlot(characterUnit, thistype.maxRucksackItemsPerPage)
397 set rightArrowItem = UnitItemInSlot(characterUnit, thistype.maxRucksackItemsPerPage + 1)
398 call DisableTrigger(this.m_dropTrigger)
399 call RemoveItem(leftArrowItem)
400 call RemoveItem(rightArrowItem)
401 call EnableTrigger(this.m_dropTrigger)
402 call this.hideCurrentRucksackPage()
403 set characterUnit = null
404 set leftArrowItem = null
405 set rightArrowItem = null
406 endmethod
407
408 /// @todo Added item player check!
409 private method equipItem takes item usedItem, boolean dontMoveToRucksack, boolean swapWithAlreadyEquipped, boolean showEquipMessage returns nothing
410 local AItemType itemType = AItemType.getItemTypeOfItem(usedItem)
411 local integer equipmentType = itemType.equipmentType()
412 local player itemPlayer = GetItemPlayer(usedItem)
413 local unit characterUnit = this.unit()
414 local item equippedItem
415 local string itemName
416 if (not this.m_rucksackIsEnabled and UnitHasItem(characterUnit, usedItem)) then //already picked up
417 call DisableTrigger(this.m_dropTrigger)
418 call UnitDropItemPoint(characterUnit, usedItem, GetUnitX(characterUnit), GetUnitY(characterUnit))
419 call EnableTrigger(this.m_dropTrigger)
420 endif
421
422 if (itemPlayer != this.user() and IsPlayerPlayingUser(itemPlayer)) then
423 call this.character().displayMessage(ACharacter.messageTypeError, tr("Gegenstand gehört einem anderen Benutzer.")) /// @todo use static string member
424 set itemPlayer = null
425 return
426 endif
427 set itemPlayer = null
428
429 if (itemType != 0 and equipmentType != -1) then
430 if (swapWithAlreadyEquipped or this.m_equipmentItemData[equipmentType] == 0) then
431 if (itemType.checkRequirement(this.character())) then
432 if (swapWithAlreadyEquipped and this.m_equipmentItemData[equipmentType] != 0) then
433 set equippedItem = this.m_equipmentItemData[equipmentType].createItem(GetUnitX(characterUnit), GetUnitY(characterUnit))
434 call this.addItemToRucksack(equippedItem, true, false)
435 call this.clearEquipmentItem(equipmentType, false)
436 set equippedItem = null
437 endif
438 set itemName = GetItemName(usedItem)
439 call this.setEquipmentItemByItem(equipmentType, usedItem, not this.m_rucksackIsEnabled)
440 if (showEquipMessage) then
441 call this.character().displayMessage(ACharacter.messageTypeInfo, StringArg(thistype.textEquipItem, itemName))
442 endif
443 set characterUnit = null
444 return
445 endif
446 endif
447 endif
448 //move to rucksack
449 if (not dontMoveToRucksack) then
450 call this.addItemToRucksack(usedItem, true, true) //if item type is 0 it will be placed in rucksack, too
451 else
452 call this.character().displayMessage(ACharacter.messageTypeError, thistype.textUnableToEquipItem)
453 endif
454 set characterUnit = null
455 endmethod
456
457 private method addItemToRucksack takes item usedItem, boolean dontMoveToEquipment, boolean showAddMessage returns nothing
458 local integer i
459 local player itemPlayer = GetItemPlayer(usedItem)
460 local unit characterUnit = this.unit()
461 local string itemName
462 if (this.m_rucksackIsEnabled and UnitHasItem(characterUnit, usedItem)) then //already picked up
463 call DisableTrigger(this.m_dropTrigger)
464 debug call this.print("Drop item from rucksack because it was already placed in")
465 call UnitDropItemPoint(characterUnit, usedItem, GetUnitX(characterUnit), GetUnitY(characterUnit))
466 call EnableTrigger(this.m_dropTrigger)
467 endif
468 set characterUnit = null
469
470 if (itemPlayer != this.user() and IsPlayerPlayingUser(itemPlayer)) then
471 call this.character().displayMessage(ACharacter.messageTypeError, tr("Gegenstand gehört einem anderen Benutzer.")) /// @todo use static string member
472 set itemPlayer = null
473 return
474 endif
475 set itemPlayer = null
476
477 set i = 0
478 loop
479 exitwhen (i == thistype.maxRucksackItems)
480 if (this.m_rucksackItemData[i] == 0 or this.m_rucksackItemData[i].itemTypeId() == GetItemTypeId(usedItem)) then
481 set itemName = GetItemName(usedItem)
482 call this.setRucksackItemByItem(i, usedItem, this.m_rucksackIsEnabled and this.itemRucksackPage(i) == this.m_rucksackPage)
483 if (showAddMessage) then
484 call this.character().displayMessage(ACharacter.messageTypeInfo, StringArg(thistype.textAddItemToRucksack, itemName))
485 endif
486 return
487 endif
488 set i = i + 1
489 endloop
490
491 //equip
492 if (not dontMoveToEquipment) then
493 call this.equipItem(usedItem, true, false, true)
494 else
495 call this.character().displayMessage(ACharacter.messageTypeError, thistype.textUnableToAddRucksackItem)
496 endif
497 endmethod
498
499 private method setEquipmentItem takes integer equipmentType, AInventoryItemData inventoryItemData, boolean add returns nothing
500 local AItemType itemType
501 set this.m_equipmentItemData[equipmentType] = inventoryItemData
502 if (add) then
503 call this.showEquipmentItem(equipmentType)
504 elseif (this.m_rucksackIsEnabled) then
505 set itemType = AItemType.getItemTypeOfItemTypeId(inventoryItemData.itemTypeId())
506 call itemType.addPermanentAbilities(this.unit())
507 endif
508 endmethod
509
510 private method setEquipmentItemByItem takes integer equipmentType, item usedItem, boolean add returns nothing
511 local AInventoryItemData inventoryItemData = AInventoryItemData.create(usedItem, this.unit())
512 call DisableTrigger(this.m_dropTrigger)
513 call RemoveItem(usedItem)
514 call EnableTrigger(this.m_dropTrigger)
515 set usedItem = null
516 call this.setEquipmentItem(equipmentType, inventoryItemData, add)
517 endmethod
518
519 private method clearEquipmentItem takes integer equipmentType, boolean drop returns nothing
520 local unit characterUnit = this.unit()
521 local item slotItem
522 local AItemType itemType
523
524 if (not this.m_rucksackIsEnabled) then
525 set slotItem = UnitItemInSlot(characterUnit, equipmentType)
526 if (slotItem != null) then
527 call thistype.clearItemIndex(slotItem)
528 call DisableTrigger(this.m_dropTrigger)
529 if (drop) then
530 call UnitDropItemPoint(characterUnit, slotItem, GetUnitX(characterUnit), GetUnitY(characterUnit))
531 else
532 call RemoveItem(slotItem)
533 endif
534 call EnableTrigger(this.m_dropTrigger)
535 set slotItem = null
536 endif
537 else
538 set itemType = AItemType.getItemTypeOfItemTypeId(this.m_equipmentItemData[equipmentType].itemTypeId())
539 call itemType.removePermanentAbilities(characterUnit)
540 endif
541 call this.m_equipmentItemData[equipmentType].destroy()
542 set this.m_equipmentItemData[equipmentType] = 0
543 call this.checkEquipment() //added
544 set characterUnit = null
545 endmethod
546
547 private method showEquipmentItem takes integer equipmentType returns nothing
548 local unit characterUnit = this.unit()
549 local item slotItem
550 local AItemType itemType = AItemType.getItemTypeOfItemTypeId(this.m_equipmentItemData[equipmentType].itemTypeId())
551 call itemType.removePermanentAbilities(characterUnit)
552 call DisableTrigger(this.m_pickupTrigger)
553 call UnitAddItemToSlotById(characterUnit, this.m_equipmentItemData[equipmentType].itemTypeId(), equipmentType)
554 call EnableTrigger(this.m_pickupTrigger)
555 set slotItem = UnitItemInSlot(characterUnit, equipmentType)
556 call this.m_equipmentItemData[equipmentType].assignToItem(slotItem)
557 call SetItemDropOnDeath(slotItem, false)
558 call thistype.setItemIndex(slotItem, equipmentType)
559 set characterUnit = null
560 set slotItem = null
561 endmethod
562
563 private method hideEquipmentItem takes integer equipmentType returns nothing
564 local unit characterUnit = this.unit()
565 local item slotItem = UnitItemInSlot(characterUnit, equipmentType)
566 local AItemType itemType = AItemType.getItemTypeOfItem(slotItem)
567 call thistype.clearItemIndex(slotItem)
568 call DisableTrigger(this.m_dropTrigger)
569 call RemoveItem(slotItem)
570 call EnableTrigger(this.m_dropTrigger)
571 call itemType.addPermanentAbilities(characterUnit)
572 set characterUnit = null
573 set slotItem = null
574 endmethod
575
576 /**
577 * Checks requirements of all equipped items. If some requirements aren't met the checked item is dropped.
578 * This should be called whenever character units attributes which are used for item type requirement change.
579 * Note: Now it should work while rucksack is opened, too.
580 */
581 private method checkEquipment takes nothing returns nothing
582 local AItemType itemType
583 local integer i = 0
584 loop
585 exitwhen (i == thistype.maxEquipmentTypes)
586 if (this.m_equipmentItemData[i] != 0) then
587 set itemType = AItemType.getItemTypeOfItemTypeId(this.m_equipmentItemData[i].itemTypeId())
588 if (not itemType.checkRequirement(this.character())) then
589 call this.clearEquipmentItem(i, true)
590 endif
591 endif
592 set i = i + 1
593 endloop
594 endmethod
595
596 private method setRucksackItem takes integer index, AInventoryItemData inventoryItemData, boolean add returns nothing
597 local boolean refreshOnly = false
598 if (this.m_rucksackItemData[index] == 0) then
599 set this.m_rucksackItemData[index] = inventoryItemData
600 else //same type
601 call this.m_rucksackItemData[index].setCharges(this.m_rucksackItemData[index].charges() + IMaxBJ(inventoryItemData.charges(), 1))
602 call inventoryItemData.destroy()
603 set refreshOnly = true
604 endif
605 if (add) then
606 if (not refreshOnly) then
607 call this.showRucksackItem(index)
608 else
609 call this.refreshRucksackItemCharges(index)
610 endif
611 endif
612 endmethod
613
614 private method setRucksackItemByItem takes integer index, item usedItem, boolean add returns nothing
615 local AInventoryItemData inventoryItemData = AInventoryItemData.create(usedItem, this.unit())
616 call DisableTrigger(this.m_dropTrigger)
617 call RemoveItem(usedItem)
618 call EnableTrigger(this.m_dropTrigger)
619 set usedItem = null
620 call this.setRucksackItem(index, inventoryItemData, add)
621 endmethod
622
623 public method clearRucksackItem takes integer index, boolean drop returns nothing
624 local unit characterUnit
625 local item slotItem
626 if (this.m_rucksackIsEnabled and this.m_rucksackPage == this.itemRucksackPage(index)) then
627 set characterUnit = this.unit()
628 set slotItem = UnitItemInSlot(characterUnit, this.rucksackItemSlot(index))
629 if (slotItem != null) then
630 call thistype.clearItemIndex(slotItem)
631 call DisableTrigger(this.m_dropTrigger)
632 if (drop) then
633 call UnitDropItemPoint(characterUnit, slotItem, GetUnitX(characterUnit), GetUnitY(characterUnit))
634 else
635 call RemoveItem(slotItem)
636 endif
637 call EnableTrigger(this.m_dropTrigger)
638 set slotItem = null
639 endif
640 set characterUnit = null
641 endif
642 call this.m_rucksackItemData[index].destroy()
643 set this.m_rucksackItemData[index] = 0
644 endmethod
645
646 private method showRucksackItem takes integer index returns nothing
647 local unit characterUnit = this.unit()
648 local integer slot = this.rucksackItemSlot(index)
649 local item slotItem
650 local AItemType itemType = AItemType.getItemTypeOfItemTypeId(this.m_rucksackItemData[index].itemTypeId())
651 call DisableTrigger(this.m_pickupTrigger)
652 call UnitAddItemToSlotById(characterUnit, this.m_rucksackItemData[index].itemTypeId(), slot)
653 call EnableTrigger(this.m_pickupTrigger)
654 set slotItem = UnitItemInSlot(characterUnit, slot)
655 call this.m_rucksackItemData[index].assignToItem(slotItem)
656 call SetItemDropOnDeath(slotItem, false)
657 call itemType.removePermanentAbilities(characterUnit)
658 call thistype.setItemIndex(slotItem, index)
659 set characterUnit = null
660 set slotItem = null
661 endmethod
662
663 public method refreshRucksackItemCharges takes integer index returns nothing
664 local unit characterUnit
665 local integer slot
666 local item slotItem
667 if (this.m_rucksackPage != this.itemRucksackPage(index)) then
668 return
669 endif
670 set characterUnit = this.unit()
671 set slot = this.rucksackItemSlot(index)
672 set slotItem = UnitItemInSlot(characterUnit, slot)
673 call SetItemCharges(slotItem, this.m_rucksackItemData[index].charges())
674 set characterUnit = null
675 set slotItem = null
676 endmethod
677
678 private method hideRucksackItem takes integer index returns nothing
679 local unit characterUnit = this.unit()
680 local integer slot = this.rucksackItemSlot(index)
681 local item slotItem = UnitItemInSlot(characterUnit, slot)
682 call thistype.clearItemIndex(slotItem)
683 call DisableTrigger(this.m_dropTrigger)
684 call RemoveItem(slotItem)
685 call EnableTrigger(this.m_dropTrigger)
686 set characterUnit = null
687 set slotItem = null
688 endmethod
689
690 private method showRucksackPage takes integer page, boolean firstCall returns nothing
691 local integer i
692 local integer exitValue
693 local item rightArrowItem
694 debug if (page > thistype.maxRucksackPages) then
695 debug call this.print("Page value is too big.")
696 debug return
697 debug endif
698
699 if (not firstCall) then
700 call this.hideCurrentRucksackPage()
701 endif
702
703 set this.m_rucksackPage = page
704 //add inventory items
705 set i = page * thistype.maxRucksackItemsPerPage
706 set exitValue = i + thistype.maxRucksackItemsPerPage
707 loop
708 exitwhen (i == exitValue)
709 if (this.m_rucksackItemData[i] != 0) then
710 call this.showRucksackItem(i)
711 endif
712 set i = i + 1
713 endloop
714
715 set rightArrowItem = UnitItemInSlot(this.unit(), thistype.maxRucksackItemsPerPage + 1)
716 call SetItemCharges(rightArrowItem, page)
717 set rightArrowItem = null
718 endmethod
719
720 private method hideCurrentRucksackPage takes nothing returns nothing
721 local integer i = this.m_rucksackPage * thistype.maxRucksackItemsPerPage
722 local integer exitValue = i + thistype.maxRucksackItemsPerPage
723 loop
724 exitwhen (i == exitValue)
725 if (this.m_rucksackItemData[i] != 0) then
726 call this.hideRucksackItem(i)
727 endif
728 set i = i + 1
729 endloop
730 endmethod
731
732 private method showNextRucksackPage takes nothing returns nothing
733 if (this.m_rucksackPage == thistype.maxRucksackPages - 1) then
734 call this.showRucksackPage(0, false)
735 else
736 call this.showRucksackPage(this.m_rucksackPage + 1, false)
737 endif
738 endmethod
739
740 private method showPreviousRucksackPage takes nothing returns nothing
741 if (this.m_rucksackPage == 0) then
742 call this.showRucksackPage(thistype.maxRucksackPages - 1, false)
743 else
744 call this.showRucksackPage(this.m_rucksackPage - 1, false)
745 endif
746 endmethod
747
748 private method resetItemSlots takes integer currentSlot, integer oldSlot returns nothing
749 local unit characterUnit = this.unit()
750 local item currentItem = UnitItemInSlot(characterUnit, currentSlot)
751 local AInventoryItemData currentItemData = 0
752 local integer currentItemIndex
753 local item otherItem = UnitItemInSlot(characterUnit, oldSlot)
754 local AInventoryItemData otherItemData = 0
755 local integer otherItemIndex
756 call DisableTrigger(this.m_dropTrigger)
757 if (currentItem != null) then
758 set currentItemData = AInventoryItemData.create(currentItem, this.unit())
759 if (currentItemData.itemTypeId() != thistype.leftArrowItemType and currentItemData.itemTypeId() != thistype.rightArrowItemType) then
760 set currentItemIndex = thistype.itemIndex(currentItem)
761 endif
762 call RemoveItem(currentItem)
763 set currentItem = null
764 endif
765 if (otherItem != null) then
766 set otherItemData = AInventoryItemData.create(otherItem, this.unit())
767 if (otherItemData.itemTypeId() != thistype.leftArrowItemType and otherItemData.itemTypeId() != thistype.rightArrowItemType) then
768 set otherItemIndex = thistype.itemIndex(otherItem)
769 endif
770 call RemoveItem(otherItem)
771 set otherItem = null
772 endif
773 call EnableTrigger(this.m_dropTrigger)
774 call DisableTrigger(this.m_pickupTrigger)
775 if (currentItemData != 0) then
776 call UnitAddItemToSlotById(characterUnit, currentItemData.itemTypeId(), oldSlot)
777 set currentItem = UnitItemInSlot(characterUnit, oldSlot)
778 call currentItemData.assignToItem(currentItem)
779 if (currentItemData.itemTypeId() != thistype.leftArrowItemType and currentItemData.itemTypeId() != thistype.rightArrowItemType) then
780 call thistype.setItemIndex(currentItem, currentItemIndex)
781 endif
782 call currentItemData.destroy()
783 set currentItem = null
784 endif
785 if (otherItemData != 0) then
786 call UnitAddItemToSlotById(characterUnit, otherItemData.itemTypeId(), currentSlot)
787 set otherItem = UnitItemInSlot(characterUnit, currentSlot)
788 call otherItemData.assignToItem(otherItem)
789 if (otherItemData.itemTypeId() != thistype.leftArrowItemType and otherItemData.itemTypeId() != thistype.rightArrowItemType) then
790 call thistype.setItemIndex(otherItem, otherItemIndex)
791 endif
792 call otherItemData.destroy()
793 set otherItem = null
794 endif
795 call EnableTrigger(this.m_pickupTrigger)
796 endmethod
797
798 private method moveRucksackItemToPage takes item slotItem, boolean next returns nothing
799 local unit characterUnit = this.unit()
800 local integer oldIndex = this.itemIndex(slotItem)
801 local integer oldSlot = this.rucksackItemSlot(oldIndex)
802 local integer i
803 local integer exitValue
804
805 debug call this.print("Moving item " + GetItemName(slotItem))
806
807 //reset page item (items were swapped) and drop moved item
808 call thistype.clearItemIndex(slotItem)
809 call DisableTrigger(this.m_dropTrigger)
810 call RemoveItem(slotItem)
811 call EnableTrigger(this.m_dropTrigger)
812 set slotItem = null
813
814 if (next) then
815 call this.resetItemSlots(oldSlot, thistype.maxRucksackItemsPerPage + 1)
816 set i = oldIndex + thistype.maxRucksackItemsPerPage - oldSlot
817 set exitValue = thistype.maxRucksackItems
818
819 if (i == thistype.maxRucksackItems) then
820 set i = 0
821 endif
822 else
823 call this.resetItemSlots(oldSlot, thistype.maxRucksackItemsPerPage)
824 set i = oldIndex - thistype.maxRucksackItemsPerPage + thistype.maxRucksackItemsPerPage - oldSlot - 1 //test - 1
825 set exitValue = 0
826
827 if (i < 0) then
828 set i = thistype.maxRucksackItems - 1
829 endif
830 endif
831
832 loop
833 //reached old index, remove dropped slot item and show it again. show error message.
834 if (i == oldIndex) then
835 //call RemoveItem(slotItem) //do not disable drop triggers, item is dropped
836 call this.showRucksackItem(oldIndex)
837 call this.character().displayMessage(ACharacter.messageTypeError, thistype.textUnableToMoveRucksackItem)
838 exitwhen (true)
839 //found stack place
840 elseif (this.m_rucksackItemData[i].itemTypeId() == this.m_rucksackItemData[oldIndex].itemTypeId()) then
841 call this.m_rucksackItemData[i].setCharges(this.m_rucksackItemData[i].charges() + 1)
842 call this.clearRucksackItem(oldIndex, false)
843 exitwhen (true)
844 //found a free place
845 elseif (this.m_rucksackItemData[i] == 0) then
846 call this.setRucksackItem(i, this.m_rucksackItemData[oldIndex], this.m_rucksackIsEnabled and this.itemRucksackPage(i) == this.m_rucksackPage)
847 set this.m_rucksackItemData[oldIndex] = 0
848 exitwhen (true)
849 endif
850 if (next) then
851 set i = i + 1
852 if (i == exitValue) then
853 set i = 0
854 endif
855 else
856 set i = i - 1
857 if (i == exitValue) then
858 set i = thistype.maxRucksackItems - 1
859 endif
860 endif
861 endloop
862 set characterUnit = null
863 endmethod
864
865 private method swapRucksackItemData takes item firstItem, item secondItem returns nothing
866 local integer firstIndex = this.itemIndex(firstItem)
867 local integer secondIndex = this.itemIndex(secondItem)
868 local AInventoryItemData itemData = this.m_rucksackItemData[firstIndex]
869 set this.m_rucksackItemData[firstIndex] = this.m_rucksackItemData[secondIndex]
870 call thistype.setItemIndex(firstItem, secondIndex)
871 set this.m_rucksackItemData[secondIndex] = itemData
872 call thistype.setItemIndex(secondItem, firstIndex)
873 endmethod
874
875 private method moveRucksackItem takes item movedItem, integer slot returns nothing
876 local unit characterUnit = this.unit()
877 local item targetItem
878 local integer oldIndex = this.itemIndex(movedItem)
879 local integer newIndex = this.slotRucksackIndex(slot)
880 //equip
881 if (oldIndex == newIndex) then
882 debug call this.print("Same index: Equip.")
883 set movedItem = null
884 debug call this.print("Creating item at characters position and trying to equip.")
885 set movedItem = this.m_rucksackItemData[oldIndex].createItem(GetUnitX(characterUnit), GetUnitY(characterUnit))
886 call SetItemCharges(movedItem, 0)
887 if (this.m_rucksackItemData[oldIndex].charges() > 0) then
888 call this.m_rucksackItemData[oldIndex].setCharges(this.m_rucksackItemData[oldIndex].charges() - 1)
889 call this.refreshRucksackItemCharges(oldIndex)
890 else
891 call this.clearRucksackItem(oldIndex, false)
892 endif
893 call this.equipItem(movedItem, false, true, true) //test
894 set characterUnit = null
895 return
896 endif
897 set targetItem = UnitItemInSlot(this.unit(), this.rucksackItemSlot(oldIndex))
898 //move
899 if (targetItem == null) then
900 set this.m_rucksackItemData[newIndex] = this.m_rucksackItemData[oldIndex]
901 call thistype.setItemIndex(movedItem, newIndex)
902 //destack
903 if (this.m_rucksackItemData[oldIndex].isCharged()) then
904 call this.m_rucksackItemData[oldIndex].setCharges(this.m_rucksackItemData[oldIndex].charges() - 1)
905 if (this.m_rucksackItemData[oldIndex].itemType() == ITEM_TYPE_CHARGED) then
906 call this.m_rucksackItemData[newIndex].setCharges(1)
907 else
908 call this.m_rucksackItemData[newIndex].setCharges(0)
909 endif
910 call this.showRucksackItem(oldIndex)
911 call this.refreshRucksackItemCharges(newIndex)
912 //normal movement
913 else
914 call this.m_rucksackItemData[newIndex].setCharges(this.m_rucksackItemData[oldIndex].charges())
915 //clear old, do not destroy since data was moved to new index!
916 set this.m_rucksackItemData[oldIndex] = 0
917 endif
918 call RemoveItem(targetItem)
919 set targetItem = null
920 //stack
921 elseif (GetItemTypeId(movedItem) == GetItemTypeId(targetItem)) then
922 call thistype.setItemIndex(movedItem, newIndex)
923 call this.m_rucksackItemData[newIndex].setCharges(this.m_rucksackItemData[newIndex].charges() + IMaxBJ(1, this.m_rucksackItemData[oldIndex].charges()))
924 call this.refreshRucksackItemCharges(newIndex)
925 call this.clearRucksackItem(oldIndex, false)
926 //swap
927 else
928 call this.swapRucksackItemData(movedItem, targetItem)
929 endif
930 set characterUnit = null
931 set targetItem = null
932 endmethod
933
934 private static method triggerConditionOpen takes nothing returns boolean
935 return GetSpellAbilityId() == thistype.openRucksackAbilityId
936 endmethod
937
938 private static method triggerActionOpen takes nothing returns nothing
939 local trigger triggeringTrigger = GetTriggeringTrigger()
940 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
941 if (this.m_rucksackIsEnabled) then
942 call this.disableRucksack()
943 call this.enableEquipment()
944 else
945 call this.disableEquipment()
946 call this.enableRucksack()
947 endif
948 set triggeringTrigger = null
949 endmethod
950
951 private method createOpenTrigger takes nothing returns nothing
952 local event triggerEvent
953 local conditionfunc conditionFunction
954 local triggercondition triggerCondition
955 local triggeraction triggerAction
956 set this.m_openTrigger = CreateTrigger()
957 set triggerEvent = TriggerRegisterUnitEvent(this.m_openTrigger, this.unit(), EVENT_UNIT_SPELL_CAST)
958 set conditionFunction = Condition(function thistype.triggerConditionOpen)
959 set triggerCondition = TriggerAddCondition(this.m_openTrigger, conditionFunction)
960 set triggerAction = TriggerAddAction(this.m_openTrigger, function thistype.triggerActionOpen)
961 call AHashTable.global().setHandleInteger(this.m_openTrigger, "this", this)
962 set triggerEvent = null
963 set conditionFunction = null
964 set triggerCondition = null
965 set triggerAction = null
966 endmethod
967
968 private static method triggerConditionOrder takes nothing returns boolean
969 return GetIssuedOrderId() >= 852002 and GetIssuedOrderId() <= 852007
970 endmethod
971
972 private static method triggerActionOrder takes nothing returns nothing
973 local trigger triggeringTrigger = GetTriggeringTrigger()
974 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
975 local integer newSlot = GetIssuedOrderId() - 852002
976 local item usedItem = GetOrderTargetItem()
977 local integer oldSlot
978 local item targetItem
979 local integer itemTypeId
980 local integer targetItemTypeId
981 call TriggerSleepAction(0.0) //wait until order is done, important!
982 if (this.m_rucksackIsEnabled) then
983 debug call this.print("Rucksack is enabled.")
984 if (GetItemTypeId(usedItem) == thistype.leftArrowItemType and newSlot != thistype.maxRucksackItemsPerPage) then
985 call this.resetItemSlots(newSlot, AInventory.maxRucksackItemsPerPage)
986 elseif (GetItemTypeId(usedItem) == thistype.rightArrowItemType and newSlot != thistype.maxRucksackItemsPerPage + 1) then
987 call this.resetItemSlots(newSlot, thistype.maxRucksackItemsPerPage + 1)
988 //move item previous - player drops an item on the next page item
989 elseif (GetItemTypeId(usedItem) != thistype.leftArrowItemType and newSlot == thistype.maxRucksackItemsPerPage) then
990 call this.moveRucksackItemToPage(usedItem, false)
991 //move item next - player drops an item on the previous page item
992 elseif (GetItemTypeId(usedItem) != thistype.rightArrowItemType and newSlot == thistype.maxRucksackItemsPerPage + 1) then
993 call this.moveRucksackItemToPage(usedItem, true)
994 //equip item/stack items/swap items
995 elseif (newSlot >= 0 and newSlot < thistype.maxRucksackItemsPerPage) then
996 call this.moveRucksackItem(usedItem, newSlot)
997 endif
998 //equipment is enabled
999 else
1000 set oldSlot = thistype.itemIndex(usedItem)
1001 //reset moved equipped items to their positions
1002 if (newSlot != oldSlot) then
1003 call this.resetItemSlots(newSlot, oldSlot)
1004 //old slot, add to rucksack
1005 else
1006 call this.clearItemIndex(usedItem)
1007 call this.clearEquipmentItem(oldSlot, true)
1008 call this.addItemToRucksack(usedItem, true, true)
1009 endif
1010 endif
1011 set triggeringTrigger = null
1012 set usedItem = null
1013 endmethod
1014
1015 //add, drop, move item next, move item previous, stack items, destack item, swap items
1016 private method createOrderTrigger takes nothing returns nothing
1017 local event triggerEvent
1018 local conditionfunc conditionFunction
1019 local triggercondition triggerCondition
1020 local triggeraction triggerAction
1021 set this.m_orderTrigger = CreateTrigger()
1022 set triggerEvent = TriggerRegisterUnitEvent(this.m_orderTrigger, this.unit(), EVENT_UNIT_ISSUED_TARGET_ORDER)
1023 set conditionFunction = Condition(function thistype.triggerConditionOrder)
1024 set triggerCondition = TriggerAddCondition(this.m_orderTrigger, conditionFunction)
1025 set triggerAction = TriggerAddAction(this.m_orderTrigger, function thistype.triggerActionOrder)
1026 call AHashTable.global().setHandleInteger(this.m_orderTrigger, "this", this)
1027 set triggerEvent = null
1028 set conditionFunction = null
1029 set triggerCondition = null
1030 set triggerAction = null
1031 endmethod
1032
1033 private static method triggerConditionIsNoPowerup takes nothing returns boolean
1034 local item usedItem = GetManipulatedItem()
1035 local boolean result = not IsItemIdPowerup(GetItemTypeId(usedItem))
1036 set usedItem = null
1037 return result
1038 endmethod
1039
1040 private static method triggerActionPickup takes nothing returns nothing
1041 local trigger triggeringTrigger = GetTriggeringTrigger()
1042 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
1043 local item usedItem = GetManipulatedItem()
1044 call this.equipItem(usedItem, false, false, true) //try always equipment first!
1045 set triggeringTrigger = null
1046 set usedItem = null
1047 endmethod
1048
1049 private method createPickupTrigger takes nothing returns nothing
1050 local event triggerEvent
1051 local conditionfunc conditionFunction
1052 local triggercondition triggerCondition
1053 local triggeraction triggerAction
1054 set this.m_pickupTrigger = CreateTrigger()
1055 set triggerEvent = TriggerRegisterUnitEvent(this.m_pickupTrigger, this.unit(), EVENT_UNIT_PICKUP_ITEM) //pawn?
1056 set conditionFunction = Condition(function thistype.triggerConditionIsNoPowerup)
1057 set triggerCondition = TriggerAddCondition(this.m_pickupTrigger, conditionFunction)
1058 set triggerAction = TriggerAddAction(this.m_pickupTrigger, function thistype.triggerActionPickup)
1059 call AHashTable.global().setHandleInteger(this.m_pickupTrigger, "this", this)
1060 set triggerEvent = null
1061 set conditionFunction = null
1062 set triggerCondition = null
1063 set triggerAction = null
1064 endmethod
1065
1066 private static method triggerActionDrop takes nothing returns nothing
1067 local trigger triggeringTrigger = GetTriggeringTrigger()
1068 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
1069 local item usedItem = GetManipulatedItem()
1070 local integer index = this.itemIndex(usedItem)
1071 local unit triggerUnit = GetTriggerUnit()
1072 if (this.m_rucksackIsEnabled) then
1073 //page items
1074 if (GetItemTypeId(usedItem) == thistype.leftArrowItemType) then
1075 call TriggerSleepAction(0.0)
1076 call RemoveItem(usedItem)
1077 set usedItem = null
1078 call DisableTrigger(this.m_pickupTrigger)
1079 call UnitAddItemToSlotById(this.unit(), thistype.leftArrowItemType, thistype.maxRucksackItemsPerPage)
1080 call EnableTrigger(this.m_pickupTrigger)
1081 call this.character().displayMessage(ACharacter.messageTypeError, thistype.textDropPageItem)
1082 elseif (GetItemTypeId(usedItem) == thistype.rightArrowItemType) then
1083 call TriggerSleepAction(0.0)
1084 call RemoveItem(usedItem)
1085 set usedItem = null
1086 call DisableTrigger(this.m_pickupTrigger)
1087 call UnitAddItemToSlotById(this.unit(), thistype.rightArrowItemType, thistype.maxRucksackItemsPerPage + 1)
1088 call EnableTrigger(this.m_pickupTrigger)
1089 set usedItem = UnitItemInSlot(this.unit(), thistype.maxRucksackItemsPerPage + 1)
1090 call SetItemCharges(usedItem, this.m_rucksackPage)
1091 set usedItem = null
1092 call this.character().displayMessage(ACharacter.messageTypeError, thistype.textDropPageItem)
1093 //destack and drop
1094 elseif (this.m_rucksackItemData[index].isCharged()) then
1095 call TriggerSleepAction(0.0) //wait until it has been dropped
1096 call this.m_rucksackItemData[index].setCharges(this.m_rucksackItemData[index].charges() - 1)
1097 call this.showRucksackItem(index)
1098
1099 if (GetItemType(usedItem) == ITEM_TYPE_CHARGED) then
1100 call SetItemCharges(usedItem, 1)
1101 else
1102 call SetItemCharges(usedItem, 0)
1103 endif
1104 //drop
1105 else
1106 call this.clearRucksackItem(index, true) //before drop
1107 /// @todo Stop unit?
1108 endif
1109 //unequip and drop
1110 else
1111 call this.clearEquipmentItem(index, true)
1112 /// @todo Stop unit?
1113 endif
1114 set triggeringTrigger = null
1115 set usedItem = null
1116 set triggerUnit = null
1117 endmethod
1118
1119 //drop, destack and drop, unequip and drop
1120 private method createDropTrigger takes nothing returns nothing
1121 local event triggerEvent
1122 local conditionfunc conditionFunction
1123 local triggercondition triggerCondition
1124 local triggeraction triggerAction
1125 set this.m_dropTrigger = CreateTrigger()
1126 set triggerEvent = TriggerRegisterUnitEvent(this.m_dropTrigger, this.unit(), EVENT_UNIT_DROP_ITEM)
1127 set conditionFunction = Condition(function thistype.triggerConditionIsNoPowerup)
1128 set triggerCondition = TriggerAddCondition(this.m_dropTrigger, conditionFunction)
1129 set triggerAction = TriggerAddAction(this.m_dropTrigger, function thistype.triggerActionDrop)
1130 call AHashTable.global().setHandleInteger(this.m_dropTrigger, "this", this)
1131 set triggerEvent = null
1132 set conditionFunction = null
1133 set triggerCondition = null
1134 set triggerAction = null
1135 endmethod
1136
1137 private static method triggerActionUse takes nothing returns nothing
1138 local trigger triggeringTrigger = GetTriggeringTrigger()
1139 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
1140 local item usedItem = GetManipulatedItem()
1141 local integer itemTypeId = GetItemTypeId(usedItem)
1142 local integer index
1143 /// @todo if we have no usage in equipment we could also add a trigger condition
1144 if (this.m_rucksackIsEnabled) then
1145 set usedItem = GetManipulatedItem()
1146 set itemTypeId = GetItemTypeId(usedItem)
1147 //show next page
1148 if (itemTypeId == thistype.rightArrowItemType) then
1149 call this.showNextRucksackPage()
1150 //show previous page
1151 elseif (itemTypeId == thistype.leftArrowItemType) then
1152 call this.showPreviousRucksackPage()
1153 else
1154 set index = thistype.itemIndex(usedItem)
1155 //if an item is used by decreasing its number of charges (not to 0!) we have to decrease our number, too
1156 if (this.m_rucksackItemData[index].isCharged()) then
1157 call this.m_rucksackItemData[index].setCharges(this.m_rucksackItemData[index].charges() - 1)
1158 call this.refreshRucksackItemCharges(index)
1159 //use == drop
1160 /// Drop action is called when last charge is used!!!
1161 endif
1162 endif
1163 set usedItem = null
1164 endif
1165 set triggeringTrigger = null
1166 endmethod
1167
1168 private method createUseTrigger takes nothing returns nothing
1169 local event triggerEvent
1170 local triggeraction triggerAction
1171 set this.m_useTrigger = CreateTrigger()
1172 set triggerEvent = TriggerRegisterUnitEvent(this.m_useTrigger, this.unit(), EVENT_UNIT_USE_ITEM)
1173 set triggerAction = TriggerAddAction(this.m_useTrigger, function thistype.triggerActionUse)
1174 call AHashTable.global().setHandleInteger(this.m_useTrigger, "this", this)
1175 set triggerEvent = null
1176 set triggerAction = null
1177 endmethod
1178
1179 public static method create takes ACharacter character returns thistype
1180 local thistype this = thistype.allocate(character)
1181 //members
1182 set this.m_rucksackPage = 0
1183 set this.m_rucksackIsEnabled = false
1184
1185 if (GetUnitAbilityLevel(this.unit(), thistype.openRucksackAbilityId) == 0) then
1186 call UnitAddAbility(this.unit(), thistype.openRucksackAbilityId)
1187 endif
1188
1189 call this.createOpenTrigger()
1190 call this.createOrderTrigger()
1191 call this.createPickupTrigger()
1192 call this.createDropTrigger()
1193 call this.createUseTrigger()
1194 return this
1195 endmethod
1196
1197 private method destroyOpenTrigger takes nothing returns nothing
1198 call AHashTable.global().destroyTrigger(this.m_openTrigger)
1199 set this.m_openTrigger = null
1200 endmethod
1201
1202 private method destroyOrderTrigger takes nothing returns nothing
1203 call AHashTable.global().destroyTrigger(this.m_orderTrigger)
1204 set this.m_orderTrigger = null
1205 endmethod
1206
1207 private method destroyPickupTrigger takes nothing returns nothing
1208 call AHashTable.global().destroyTrigger(this.m_pickupTrigger)
1209 set this.m_pickupTrigger = null
1210 endmethod
1211
1212 private method destroyDropTrigger takes nothing returns nothing
1213 call AHashTable.global().destroyTrigger(this.m_dropTrigger)
1214 set this.m_dropTrigger = null
1215 endmethod
1216
1217 private method destroyUseTrigger takes nothing returns nothing
1218 call AHashTable.global().destroyTrigger(this.m_useTrigger)
1219 set this.m_useTrigger = null
1220 endmethod
1221
1222 public method onDestroy takes nothing returns nothing
1223 local integer i = 0
1224 loop
1225 exitwhen (i == thistype.maxEquipmentTypes)
1226 if (this.m_equipmentItemData[i] != 0) then
1227 call this.m_equipmentItemData[i].destroy()
1228 endif
1229 set i = i + 1
1230 endloop
1231 set i = 0
1232 loop
1233 exitwhen (i == thistype.maxRucksackItems)
1234 if (this.m_rucksackItemData[i] != 0) then
1235 call this.m_rucksackItemData[i].destroy()
1236 endif
1237 set i = i + 1
1238 endloop
1239 call UnitRemoveAbility(this.unit(), thistype.openRucksackAbilityId)
1240
1241 call this.destroyOpenTrigger()
1242 call this.destroyOrderTrigger()
1243 call this.destroyPickupTrigger()
1244 call this.destroyDropTrigger()
1245 call this.destroyUseTrigger()
1246 endmethod
1247
1248 public static method init takes integer leftArrowItemType, integer rightArrowItemType, integer openRucksackAbilityId, string textUnableToEquipItem, string textEquipItem, string textUnableToAddRucksackItem, string textAddItemToRucksack, string textUnableToMoveRucksackItem, string textDropPageItem returns nothing
1249 //static start members
1250 set thistype.leftArrowItemType = leftArrowItemType
1251 set thistype.rightArrowItemType = rightArrowItemType
1252 set thistype.openRucksackAbilityId = openRucksackAbilityId
1253 set thistype.textUnableToEquipItem = textUnableToEquipItem
1254 set thistype.textEquipItem = textEquipItem
1255 set thistype.textUnableToAddRucksackItem = textUnableToAddRucksackItem
1256 set thistype.textAddItemToRucksack = textAddItemToRucksack
1257 set thistype.textUnableToMoveRucksackItem = textUnableToMoveRucksackItem
1258 set thistype.textDropPageItem = textDropPageItem
1259 endmethod
1260
1261 /// @return Returns the page of a rucksack item by index.
1262 public static method itemRucksackPage takes integer index returns integer
1263 debug if (index >= thistype.maxRucksackItems or index < 0) then
1264 debug call thistype.staticPrint("Wrong rucksack index: " + I2S(index) + ".")
1265 debug return 0
1266 debug endif
1267 return index / thistype.maxRucksackItemsPerPage
1268 endmethod
1269
1270 /// Just required for the move order and for item dropping.
1271 private static method setItemIndex takes item usedItem, integer index returns nothing
1272 call AHashTable.global().setHandleInteger(usedItem, "AInventory_index", index)
1273 endmethod
1274
1275 /// Just required for the move order and for item dropping.
1276 private static method itemIndex takes item usedItem returns integer
1277 return AHashTable.global().handleInteger(usedItem, "AInventory_index")
1278 endmethod
1279
1280 /// Just required for the move order and for item dropping.
1281 private static method clearItemIndex takes item usedItem returns nothing
1282 call AHashTable.global().removeHandleInteger(usedItem, "AInventory_index")
1283 endmethod
1284 endstruct
1285
1286 endlibrary